package de.wittekind.bundesjugendspiele.server.setup;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import de.wittekind.bundesjugendspiele.server.BackendConfig;
import de.wittekind.bundesjugendspiele.server.DatabaseConnectionManager;
import de.wittekind.bundesjugendspiele.server.db.DBServer;
import de.wittekind.bundesjugendspiele.server.hsqldbTools.HSQLDBServer;
import de.wittekind.bundesjugendspiele.server.interfaces.Constants;
import de.wittekind.bundesjugendspiele.server.modes.*;
import de.wittekind.bundesjugendspiele.server.mysqlTools.MySQLServer;

public class Setup {

	public static void setup(BackendConfig config) {
		BufferedReader c = new BufferedReader(new InputStreamReader(System.in));
		boolean overwrite = false;
		if (config.isExisting()) {
			System.out
					.println("Es gibt bereits eine Konfigurationsdatei. Möchten Sie diese Überschreiben? (Y/n)");
			String s = getLine(c);
			overwrite = "Y".equals(s);
		}
		if (!config.isExisting() || overwrite) {
			setupDB(c, config);
			setupRPC(c, config);
			setupDbData(c, config);
			if (config.getRPC().equals(RPC.RMI)) {
				setupRMI(c, config);
			}
			userAdd(config);
		}
	}

	private static void setupRMI(BufferedReader c, BackendConfig config) {
		System.out.println("Geben Sie den RMI-Namen an (Meistens loader)");
		config.setRMIName(getLine(c));
		setupRMIPort(c, config);
		System.out.println("Geben Sie den RMI-Host an (Meistens localhost)");
		config.setRMIHost(getLine(c));
	}

	private static void setupRMIPort(BufferedReader c, BackendConfig config) {
		System.out.println("Geben Sie den RMI-Port an (Meistens 1099)");
		try {
			config.setRMIPort(new Integer(getLine(c)));
		} catch (NumberFormatException e) {
			setupRMIPort(c, config);
		}
	}

	private static void setupDbData(BufferedReader c, BackendConfig config) {
		System.out
				.println("Geben Sie den Datenbankhost an (Normalerweise localhost)");
		config.setDbHost(getLine(c));
		System.out.println("Geben Sie die Datenbank an");
		config.setDbDatabase(getLine(c));
		System.out.println("Geben Sie den Datenbankbenutzer an");
		config.setDbUser(getLine(c));
		System.out.println("Geben Sie das Datenbankpasswort an");
		config.setDbPassword(getLine(c));
		setDbPort(c, config);
	}

	private static void setDbPort(BufferedReader c, BackendConfig config) {
		System.out
				.println("Geben Sie den Datenbankport an (Bei MySQL meistens 3306) ");
		try {
			config.setDbPort(new Integer(getLine(c)));
		} catch (NumberFormatException e) {
			setDbPort(c, config);
		}
	}

	private static void setupDB(BufferedReader c, BackendConfig config) {
		System.out.println("Geben Sie an, welche Datenbank sie verwenden");
		for (int i = 0; i < Database.values().length; i++) {
			System.out.println(Database.values()[i] + " [" + i + "]");
		}
		try {
			int db = new Integer(getLine(c));
			if (db >= 0 && db < Database.values().length) {
				config.setDatabase(Database.values()[db]);
			} else {
				setupDB(c, config);
			}
		} catch (NumberFormatException e) {
			setupDB(c, config);
		}
	}

	private static void setupRPC(BufferedReader c, BackendConfig config) {
		System.out.println("Geben Sie an, welches RPC sie verwenden");
		for (int i = 0; i < RPC.values().length; i++) {
			System.out.println(RPC.values()[i] + " [" + i + "]");
		}
		try {
			int rpc = new Integer(getLine(c));
			if (rpc >= 0 && rpc < RPC.values().length) {
				config.setRPC(RPC.values()[rpc]);
			} else {
				setupRPC(c, config);
			}
		} catch (NumberFormatException e) {
			setupRPC(c, config);
		}
	}

	private static String getLine(BufferedReader c) {
		try {
			return c.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) throws IOException {
		String path = Constants.BACKEND_CONFIG;
		setup(new BackendConfig(path));
	}

	private static void userAdd(BackendConfig config) {
		DBServer server = null;
		switch (config.getDatabase()) {
		case MySQL:
			server = new MySQLServer(config.getDbHost(), config.getDbUser(),
					config.getDbPassword(), config.getDbDatabase());
			break;
		case HSQLDB:
			server = new HSQLDBServer();
			break;
		}
		server.start();
		Connection c = DatabaseConnectionManager.getConnection();
		Users.addNewUserDialog(c);
		server.stop();
	}
}
